package Negocios;

import CDB.Detalleproducto;
import CDB.Detalleventa;
import CDB.PersonFactory;
import CDB.Producto;
import CDB.Ventas;
import java.awt.HeadlessException;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author lightemp
 */
public class ControlSalesDetail {

    private Session session;
    private Transaction transaction;
    private SessionFactory sessionFactory;

    public List selectAll() {
        List listDetVentas;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                listDetVentas = session.createQuery("from Detalleventa ds").list();
                return listDetVentas;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                return null;
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public Detalleventa selectByIdDetalleVenta(long idDetalleVenta) {
        Detalleventa Detalle;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                Detalle = (Detalleventa) session.createQuery("from Detalleventa ds where "
                        + "ds.iddetalleventa='" + idDetalleVenta + "'").list().get(0);
                return Detalle;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                return null;
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public List selectByIdVenta(long idVenta, long idProducto) {
        List venta;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                venta = session.createQuery("from Detalleventa dv where dv.venta.idventa="
                        + idVenta
                        + " and dv.producto.idproducto="
                        + idProducto).list();
                return venta;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                return null;
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public List selectByIdVenta(long idVenta) {
        List venta;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                venta = session.createQuery("from Detalleventa dv where dv.ventas.idventa="
                        + idVenta).list();
                return venta;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                return null;
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public void add(Ventas venta, Producto producto, Detalleproducto detalle) {
        try {
            iniciaSF();
            Detalleventa detalleVentas = new Detalleventa();
            //Creando un objeto
            detalleVentas.setProducto(producto);
            detalleVentas.setVentas(venta);
            detalleVentas.setDetalleproducto(detalle);
            session.save(detalleVentas);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }

    public void Update(int idDetalleVenta, Ventas venta, Producto producto) {
        try {
            iniciaSF();

            Detalleventa detalleVentas = (Detalleventa) session.load(Detalleventa.class,
                    new Integer(idDetalleVenta));
            detalleVentas.setProducto(producto);
            detalleVentas.setVentas(venta);
            session.update(detalleVentas);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }

    public void delete(int idDetalleVenta) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Detalleventa detalleVentas = (Detalleventa) session.load(Detalleventa.class,
                    new Integer(idDetalleVenta));
            session.delete(detalleVentas);
            //Si no ocurrio error hago comit y termino la sesion
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }

    }
    
        public void delete(Detalleventa detalle) {
        try {
            Session sesion = createSession();
            Transaction tx = sesion.beginTransaction();            
            sesion.delete(detalle);
            //Si no ocurrio error hago comit y termino la sesion
            tx.commit();
            sesion.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }

    }

    public void iniciaSF() {
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de detalles de ventas.", "Error al iniciar Session",
                    0);
        }

    }

    public void cierraSF() {
        try {
            transaction.commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de detalles de ventas.", "Error al cerrar Session",
                    0);
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva sesion para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de categorias.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }
}
